Config
Extremely simple module to decouple application config from the file system, which has handful of benefits.
- Can rely on more sources to feed configuration.
- Easy to define fake values during testing.
- A much nicer API to read nested values.
Table of contents
Usage
Install the package from npm as follows
npm i @poppinss/config
yarn add @poppinss/config
and then use the class as follows:
import { Config } from '@poppinss/config'
const initialConfiguration = {
app: {
name: 'adonis',
},
database: {
connection: 'mysql',
},
logger: {
level: 'debug',
},
}
const config = new Config(initialConfiguration)
config.get('app.name')
config.get('database.connection')
config.get('database.user', 'root')
Why not simply create the config files?
Majority of projects create config files next to the source files or inside a dedicated config directory and require those files wherever needed.
However, with AdonisJs, we make the process of config management a little bit better over manually requiring config files and it has handful of benefits.
AdonisJs recommends to save all configuration inside the config
directory and then behind the scenes it read those files and feed it's content to the Config
class and later the application developer can get rid of importing config files and rely on the Config
class instance instead.
Multiple config sources
We virtually decouple the config from the filesystem, which means your app can read the configuration from anywhere and pass it to the Config
class. For example:
const { db } from 'some-db-module'
import { Config } from '@poppinss/config'
const settings = await db.table('settings').select('*')
const config = new Config({})
settings.forEach((row) => {
config.set(row.key, JSON.parse(row.value))
})
Easy to fake during tests
Now since, you are not requiring the config files directly inside your application code, you can easily provide fake values during tests.
Config file
export const db = {
connection: 'pg'
}
Config module
import { Config } from '@poppinss/config'
import { db } from './config/database'
export default new Config({ db })
Application code
import { Db } from 'some-db-module'
import config from './config'
const db = new Db(config.get('db'))
class UserController {
async store () {
}
}
Test code
import config from './config'
config.set('db.connection', 'sqlite')
Reading nested values
Reading nested values in Javascript isn't fun. You have to ensure that top level object is actually an object before accessing it's child.
However, with this module, you can pull nested values without worrying about the intermediate parents being undefined
or null
.
config.get('database.mysql.connection.host', '127.0.0.1')
The get
method will return 127.0.0.1
if any of the parents or the value of host
itself is non-existent.
API
Following are the autogenerated files via Typedoc
Maintainers
Harminder virk